package icu.luoxi.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import icu.luoxi.task.DynamicTaskSchedulerService;
import icu.luoxi.utils.UUIDGenerator;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import icu.luoxi.service.ScheduledTaskService;
import icu.luoxi.model.entity.ScheduledTask;
import icu.luoxi.common.BaseResponse;
import icu.luoxi.common.ErrorCode;
import icu.luoxi.common.ResultUtils;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 系统定时任务表 前端控制器
 * </p>
 *
 * @author 洛希极限
 * @since 2025-05-06
 */
@RestController
@RequestMapping("/tasks")
public class ScheduledTaskController {

    @Resource
    private ScheduledTaskService scheduledTaskService;

    @Resource
    private DynamicTaskSchedulerService dynamicTaskSchedulerService;

    /**
     * 启动定时任务
     * @param taskKey 任务key
     * @return 启动结果
     */
    @ApiOperation(value = "启动定时任务")
    @PostMapping("/start")
    public BaseResponse startTask(@RequestParam String taskKey) {
        if (dynamicTaskSchedulerService.startTask(taskKey)){
            return ResultUtils.success("Task started successfully");
        } else {
            return ResultUtils.error(ErrorCode.PARAMS_ERROR);
        }
    }

    /**
     * 停止定时任务
     * @param taskKey 任务key
     * @return 停止结果
     */
    @ApiOperation(value = "停止定时任务")
    @PostMapping("/stop")
    public BaseResponse stopTask(@RequestParam String taskKey) {
        if (dynamicTaskSchedulerService.stopTask(taskKey)){
            return ResultUtils.success("Task stopped successfully");
        } else {
            return ResultUtils.error(ErrorCode.PARAMS_ERROR);
        }
    }

    /**
     * 创建定时任务
     * @param scheduledTask 实体对象
     * @return 创建结果
     */
    @ApiOperation(value = "创建定时任务")
    @PostMapping("/create")
    public BaseResponse createTask(@RequestBody ScheduledTask scheduledTask) {
        // 校验TaskKey是否存在
        ScheduledTask task = scheduledTaskService.getOne(new QueryWrapper<ScheduledTask>().eq("task_key", scheduledTask.getTaskKey()));
        if (task != null){
            return ResultUtils.error(ErrorCode.PARAMS_ERROR,"TaskKey已存在");
        }
        scheduledTask.setId(UUIDGenerator.getOne());
        boolean save = scheduledTaskService.save(scheduledTask);
        if (save){
            return ResultUtils.success("保存成功");
        }else {
            return ResultUtils.error(ErrorCode.PARAMS_ERROR);
        }
    }

    /**
     * 更新定时任务
     * @param scheduledTask 实体对象
     * @return 更新结果
     */
    @ApiOperation(value = "更新定时任务")
    @PostMapping("/update")
    public BaseResponse updateTask(@RequestBody ScheduledTask scheduledTask) {
        // 空值校验
        if (scheduledTask.getId() == null){
            return ResultUtils.error(400,"id不能为空");
        }
        // 查询任务是否存在
        ScheduledTask task = scheduledTaskService.getOne(new QueryWrapper<ScheduledTask>().eq("id", scheduledTask.getId()));
        if (task == null){
            return ResultUtils.error(ErrorCode.PARAMS_ERROR);
        } else {
            boolean update = scheduledTaskService.updateById(scheduledTask);
            if (update){
                boolean taskCron = dynamicTaskSchedulerService.updateTaskCron(scheduledTask.getId());
                if (taskCron){
                    return ResultUtils.success("定时任务更新成功");
                } else {
                    return ResultUtils.error(503,"定时任务更新周期失败");
                }
            } else {
                return ResultUtils.error(503,"定时任务更新失败");
            }
        }
    }

    /**
     * 根据id主键删除
     * @param id 主键
     * @return 删除结果
     */
    @DeleteMapping("/del")
    public BaseResponse del(@RequestParam Integer id) {
        boolean del = scheduledTaskService.removeById(id);
        if (del){
            return ResultUtils.success("删除成功");
        }else {
            return ResultUtils.error(ErrorCode.PARAMS_ERROR);
        }
    }

    /**
     * 根据id主键批量删除
     * @param ids 主键列表
     * @return 删除结果
     */
    @DeleteMapping("/delByList")
    public BaseResponse delByList(@RequestParam List<Integer> ids) {
        boolean del = scheduledTaskService.removeByIds(ids);
        if (del){
            return ResultUtils.success("删除成功");
        }else {
            return ResultUtils.error(ErrorCode.PARAMS_ERROR);
        }
    }

    /**
     * 列表查询
     * @return 列表结果
     */
    @GetMapping("/list")
    public BaseResponse<List<ScheduledTask>> findAll() {
        List<ScheduledTask> scheduledTaskList = scheduledTaskService.list();
        return ResultUtils.success(scheduledTaskList);
    }

    /**
     * 单条查询
     * @param id 主键id
     * @return 单条记录结果
     */
    @GetMapping("/findOne")
    public BaseResponse<ScheduledTask> findOne(@RequestParam Integer id) {
        return ResultUtils.success(scheduledTaskService.getById(id));
    }

    /**
     *  分页查询
     * @param pageNum 页码
     * @param pageSize 尺寸
     * @return 分页查询结果
     */
    @GetMapping("/page")
    public BaseResponse<Page<ScheduledTask>> page(@RequestParam Integer pageNum,@RequestParam Integer pageSize) {
        QueryWrapper<ScheduledTask> queryWrapper = new QueryWrapper<>();
        return ResultUtils.success(scheduledTaskService.page(new Page<>(pageNum, pageSize)));
    }

}

